package classfile

/*

	fieldref表示字段符号引用
	methodref表示普通（非接口）方法符号引用
	interfacemethodRef表示接口方法符号引用

	引用指的某个成员用到了别的成员，比如一般我们写helloWorld例子时
	main方法就引用了System.out字段

	jmv规范的规定如下
	CONSTANT_Fieldref_info {
	    u1 tag;
	    u2 class_index;
	    u2 name_and_type_index;
	}
	CONSTANT_Methodref_info {
	    u1 tag;
	    u2 class_index;
	    u2 name_and_type_index;
	}
	CONSTANT_InterfaceMethodref_info {
	    u1 tag;
	    u2 class_index;
	    u2 name_and_type_index;
	}
*/

/*
	这三个类型相当于ConstantMemberrefInfo的子类
	go语言没有继承，通过结构嵌套来模拟

*/
type ConstantFieldrefInfo struct{ ConstantMemberrefInfo }
type ConstantMethodrefInfo struct{ ConstantMemberrefInfo }
type ConstantInterfaceMethodrefInfo struct{ ConstantMemberrefInfo }

type ConstantMemberrefInfo struct {
	cp               ConstantPool
	classIndex       uint16
	nameAndTypeIndex uint16
}

func (self *ConstantMemberrefInfo) readInfo(reader *ClassReader) {
	self.classIndex = reader.readUint16()
	self.nameAndTypeIndex = reader.readUint16()
}

func (self *ConstantMemberrefInfo) ClassName() string {
	return self.cp.getClassName(self.classIndex)
}
func (self *ConstantMemberrefInfo) NameAndDescriptor() (string, string) {
	return self.cp.getNameAndType(self.nameAndTypeIndex)
}
